package com.etalk.crm.dao;

import com.etalk.crm.pojo.*;
import io.swagger.models.auth.In;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author Jordan
 */
@Mapper
public interface PersonMapper {
    /**
     * 查询所有有效的老师
     *
     * @param teaSiteId 教学基地
     * @return 老师列表
     */
    List<String> selectTeacherListByMsgSend(@Param("teaSiteId") List<Integer> teaSiteId);

    /**
     * 查询有绑定app或微信公众号的学员
     *
     * @return
     */
    List<Person> selectStudentListByMsgSend();

    /**
     * 查询SSCteacher
     *
     * @return
     * @date 2018-05-18
     */
    List<Person> selectSSCTeacher();

    /**
     * 查询所有有效的学生
     *
     * @param studentName
     * @return 学生列表
     */
    List<Person> selectStudentListByPaperSend(@Param("studentName") String studentName);

    /**
     * 根据sscId  查询学员列表
     *
     * @param ccId
     * @return
     */
    List<Person> personList(@Param("ccId") Integer ccId, @Param("loginName") String loginName);

    /**
     * 根据personId查询学员信息
     *
     * @param personId
     * @return
     */
    Person selectByPersonId(@Param("personId") int personId);

    /**
     * 根据登录名查询学员信息，用于excel导入
     *
     * @param loginName
     * @return
     */
    Person selectPersonByLoginName(@Param("loginName") String loginName);

    /**
     * 根据登录名集合查询用户
     *
     * @param loginNameList
     * @return
     */
    List<RecommendUsers> selectPersonByLoginNameList(@Param("loginNameList") List loginNameList);

    /**
     * 根据登录名查询学员信息
     *
     * @param loginNameList
     * @return
     */
    List<Person> selectPersonAndOpenIds(@Param("loginNameList") List loginNameList);

    /**
     * 根据用户id查询信息卡数据
     *
     * @param personId 学员id
     * @return 结果
     */
    StudentInfo selectStudentInfoByPersonId(@Param("personId") int personId);

    /**
     * 查询学员绑定的微信
     *
     * @param personId 学员id
     * @return 昵称和头像
     */
    List<Map<String, Object>> selectWeixinByPersonId(@Param("personId") int personId);

    /**
     * 查询学员绑定的app设备
     *
     * @param personId 学员id
     * @return 手机系统版本\类型和是否在线
     */
    List<Map<String, Object>> selectAppOnlineByPersonId(@Param("personId") int personId);

    /**
     * 查询学员信息变更记录
     *
     * @param personId 学员id
     * @return 记录
     */
    List<StudentChangeRecord> selectStudentChangeRecord(@Param("personId") int personId);


    /**
     * @param state：0无效，1有效，null全部
     * @return
     * @author James
     * 查询活动列表
     **/
    List<Map<String, Object>> selectExperienceInfo(@Param("state") Integer state);


    /**
     * @return
     * @Author James
     * @Description 查询所属代理
     * @Date 10:51 2019/1/18
     * @Param
     **/
    List<Agents> agentsList();

    /**
     * @param
     * @return
     * @Author James
     * 查询渠道分类信息，学员列表查询用
     */
    List<Map<String, Object>> channeList();

    /**
     * @return
     * @Author James
     * @Description查询记录状态：0无效，1有效，null全部
     * @Date 15:31 2019/1/18
     * @Param
     **/
    List<Map<String, Object>> selectRevisitInfo(@Param("state") Integer state);

    /*
     * @Author James
     * @Description 修改学员基本 信息
     * @Date 16:33 2019/1/21
     * @Param
     * @return
     **/
    int updateByPersonId(StudentInfo studentInfo);

    /**
     * @return
     * @Author James
     * @Description 修改学员基本信息
     * @Date 16:53 2019/1/21
     * @Param
     **/
    int updateStuInfo(StudentInfo studentInfo);

    /**
     * @return
     * @Author James
     * @Description 添加学员
     * @Date 16:53 2019/1/21
     * @Param
     **/
    int addPerson(StudentInfo studentInfo);

    /**
     * @return
     * @Author James
     * @Description 添加学员基本信息
     * @Date 16:53 2019/1/21
     * @Param
     **/
    int insertInfo(StudentInfo studentInfo);

    /**
     * 动态修改到店状态
     * @param personId 学员id
     * @param classStores 到店状态：1是，0否
     * @return 记录数
     */
    int updateClassStoresByPersonId(@Param("personId")int personId,@Param("classStores")int classStores);

    /**
     * @return
     * @Author James
     * @Description 常用上课时间段列表
     * @Date 19:58 2019/1/22
     * @Param
     **/
    List<StuPreferences> selectOftenClassTimeConf(@Param("list") List<Integer> list);

    /**
     * @return List<Map < String, Object>>
     * @Author James
     * @Description 查询学员偏好设置选项
     * @Date 19:58 2019/1/22
     * @Param
     **/
    List<Map<String, Object>> selectSceneInfo(@Param("personId") Integer personId);

    /**
     * @return List<Map < String, Object>>
     * @Author James
     * @Description 添加学员偏好设置选项
     * @Date 19:58 2019/1/22
     * @Param
     **/
    int insertSceneInfo(List<PersonJoinSceneInfo> list);

    /**
     * @return int
     * @Author James
     * @Description 删除学员偏好设置选项
     * @Date 14:19 2019/1/24
     * @Param [map]
     **/
    int deletePersonSceneInfoByPersonId(Map<String, Object> map);

    /**
     * @return int
     * @Author James 查询 删除学员偏好设置选项 是否存在
     * @Date 14:19 2019/1/24
     * @Param [map]
     **/
    int sceneInfoByPersonId(Map<String, Object> map);


    /**
     * @return
     * @Author James
     * @Description 历史老师top五星榜查询
     * @Date 11:26 2019/1/25
     * @Param
     **/
    List<LessonAndTeacher> selectFiveStartTeacher(@Param("personId") Integer personId);


    /**
     * @return
     * @Author James
     * @Description 黑名单 老师列表
     * @Date 14:28 2019/1/25
     * @Param
     **/
    List<LessonAndTeacher> selectBlackList(@Param("personId") Integer personId);

    /**
     * @return
     * @Author James
     * @Description 删除黑名单老师
     * @Date 14:28 2019/1/25
     * @Param
     **/
    int delBadTeacher(@Param("id") int id);

    /**
     * 老师列表
     *
     * @param teacherLogin 老师登录名
     * @return
     */
    List<LessonAndTeacher> searchByTeacherName(@Param("teacherLogin") String teacherLogin);


    /**
     * @return
     * @Author James
     * @Description 添加黑名单老师
     * @Date 12:44 2019/1/26
     * @Param
     **/
    int addBadTeacher(@Param("teacherLogin") String teacherLogin, @Param("personId") int personId);


    /**
     * @return
     * @Author James
     * @Description 黑名单老师是否存在
     * @Date 13:04 2019/1/26
     * @Param
     **/
    int searchBadTeacherByName(@Param("teacherLogin") String teacherLogin, @Param("personId") int personId);


    /**
     * @return
     * @Author James
     * @Description 老师等级信息
     * @Date 14:38 2019/1/26
     * @Param
     **/
    List<LessonAndTeacher> selectTeacherLevelInfo(@Param("list") List<Integer> list);

    /**
     * 常用老师老师id
     *
     * @param personId
     * @return
     */
    LessonAndTeacher teacherIdsInfoByPersonId(@Param("personId") int personId);


    /**
     * @return
     * @Author James
     * @Description
     * @Date 17:51 2019/1/26
     * @Param
     **/
    int addTeacher(LessonAndTeacher lessonAndTeacher);

    /**
     * 常用老师是否存在
     *
     * @param personId  学员id
     * @param teacherId 老师id
     * @return 记录数
     */
    int teacherIsExist(@Param("personId") int personId, @Param("teacherId") int teacherId);

    /**
     * 适合年龄段列表
     *
     * @return
     */
    List<GradeLevel> ageGroupList();

    /**
     * 教学风格段列表
     *
     * @return
     */
    List<GradeLevel> teachingStyleList();

    /**
     * 添加 学员偏好设置
     *
     * @param stuPreferences
     * @return
     */
    int addStuPrefer(StuPreferences stuPreferences);


    /**
     * @return
     * @Author James
     * @Description 查询 学员偏好设置
     * @Date 11:05 2019/1/28
     * @Param
     **/
    StuPreferences stuPrefer(@Param("personId") int personId);

    /**
     * @return
     * @Author James
     * @Description 更新学员偏好设置
     * @Date 11:06 2019/1/28
     * @Param
     **/
    int updataStuPrefer(StuPreferences stuPreferences);

    /**
     * 查询学员年龄
     *
     * @param personId
     * @return
     */
    StudentInfo stuAge(@Param("personId") int personId);


    /**
     * @return
     * @Author James
     * @Description 系统推荐老师查询
     * @Date 16:53 2019/1/28
     * @Param
     **/
    List<LessonAndTeacher> sysTeacherInfo(StuPreferences stuPreferences);


    /**
     * @return
     * @Author James
     * @Description添加学员 常用上课时间配置
     * @Date 18:13 2019/1/28
     * @Param
     **/
    int addStuPreferConfig(@Param("list") List<StuPreferences> list);

    /**
     * @return
     * @Author James
     * @Description 删除 常用上课时间配置
     * @Date 18:13 2019/1/28
     * @Param
     **/
    int delStuPreferConfig(@Param("personId") int personId);


    /**
     * @return
     * @Author James
     * @Description 查询 常用上课时间配置 是否存在
     * @Date 18:14 2019/1/28
     * @Param
     **/
    List<StuPreferences> selectStuPreferConfig(@Param("personId") int personId);


    /**
     * @return
     * @Author James
     * @Description //TODO
     * @Date 12:13 2019/1/29
     * @Param
     **/
    int updateLessonsUptime(Person person);


    /**
     * @return
     * @Author James
     * @Description cc ssc 学员信息
     * @Date 18:42 2019/1/29
     * @Param
     **/
    StudentInfo selectCcSsc(@Param("personId") int personId);

    /**
     * 查询用户已绑定ssc
     *
     * @param personId 用户id
     * @return ssc id
     */
    Integer selectSscIdByPersonId(@Param("personId") int personId);

    /**
     * 查询后台账号绑定的学习账号
     * @param userId 后台账号id
     * @return 学习账号id
     */
    Integer selectPersonIdByUserId(@Param("userId") int userId);

    /**
     * 查询用户是否提醒到店操作
     *
     * @param personId 学员id
     * @return 标识信息
     */
    Integer selectClassStoresById(@Param("personId") int personId);

    /**
     * @return
     * @Author James
     * @Description 学员客户父级属性
     * @Date 18:57 2019/1/29
     * @Param
     **/
    List<GradeLevel> selectAllRevisit(@Param("state") int state, @Param("roleId") int roleId);

    /**
     * @return
     * @Author Terwer
     * @Description 学员客户父级属性之外的扩展属性
     * @Date 18:57 2019/5/9
     * @Param
     **/
    List<GradeLevel> selectAllExtRevisit(@Param("state") int state, @Param("roleId") int roleId);

    /**
     * 查询学员客户属性
     *
     * @param personId 学员id
     * @return 学员客户属性
     */
    Map<String, Object> selectRevisitByPersonId(@Param("personId") int personId);

    /**
     * @return
     * @Author James
     * @Description 删除常用老师
     * @Date 16:44 2019/2/13
     * @Param
     **/
    int delTeacher(@Param("teacherId") int teacherId, @Param("personId") int personId);


    /**
     * @return
     * @Author James
     * @Description 查询有效订单
     * @Date 10:35 2019/2/14
     * @Param
     **/
    List<Integer> effectiveOrders(@Param("personId") int personId);

    /**
     * @return
     * @Author James
     * @Description 电话号码是否存在
     * @Date 14:26 2019/2/14
     * @Param
     **/
    int phoneNumIsExist(@Param("phone") String phone, @Param("personId") Integer personId, @Param("loginName") String loginName);

    /**
     * 学员 常用上课时间列表
     *
     * @param personId
     * @return
     */
    List<StuPreferences> stuPreferListByPersonId(@Param("personId") int personId);

    /**
     * 查询某个学生当天的提醒数目
     *
     * @param userId 学生ID
     * @return 当天的提醒数目
     */
    Integer selectRemindCount(@Param("userId") Integer userId, @Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * @return
     * @Author James
     * @Description pcp  学员 基本信息
     * @Date 15:06 2019/2/21
     * @Param
     **/
    StudentInfo pcpInfo(@Param("personId") int personId);

    /**
     * 更新pcp学员信息
     *
     * @param personId 学员ID
     * @param learningDifficulty 学习困难
     * @return
     */
    int updatePcpInfo(@Param("personId") int personId, @Param("learningDifficulty") String learningDifficulty);

    /**
     * 查询学员最后一节课程的星星
     *
     * @param personId 学员ID
     * @return 结果
     */
    Integer selectLastLessonStar(@Param("personId") int personId);

    /**
     * 查询渠道分组的信息
     *
     * @return
     */
    List<Map<String, Object>> selectChannelInfoByType();

    /**
     * @return
     * @Author James
     * @Description 学员基本信息 客户属性列表
     * @Date 19:11 2019/3/7
     * @Param
     **/
    List<Map<String, Object>> selectRevisitList(@Param("state") Integer state);

    /**
     * @return
     * @Author James
     * @Description 学员基本信息 客户属性 子级列表
     * @Date 19:11 2019/3/7
     * @Param
     **/
    List<Map<String, Object>> selectChildRevisitInfo(@Param("parentId") Integer parentId);


    /**
     * @return
     * @Author James
     * @Description 分页查询学生信息记录
     * @Date 10:27 2019/3/11
     * @Param
     **/
    List<StudentInfo> searchStudentInfoByPage(PersonParamter record);

    /**
     * @return
     * @Author James
     * @Description 分页查询学生信息记录 总条数
     * @Date 10:27 2019/3/11
     * @Param
     **/
    int personCounter(PersonParamter record);

    /**
     * @param listPersonId 学员id
     * @return 学员详情
     * @author James
     * @Description 分页查询学生详细信息记录
     * @date 10:27 2019/3/11
     **/
    List<StudentInfo> personInfoForPage(@Param("personIds") List<Integer> listPersonId);

    /**
     * 查询学员列表中的学员奖学金状态
     *
     * @param listPersonId 学员id
     * @return 学员id和奖学金状态列表
     */
    List<StudentInfo> selectScholarshipState(@Param("personIds") List<Integer> listPersonId);

    /**
     * 查询该学员原来 cc  ssc
     *
     * @param personId
     * @return
     */
    Person selectOldCCOrSsc(@Param("personId") int personId);

    /**
     * 转单  修改cc(添加跟踪动态添加人)
     *
     * @param map
     * @return
     */
    int updateAddUserForTrackRemind(Map<String, Object> map);

    /**
     * @return
     * @Author James
     * @Description 删除学员
     * @Date 15:55 2019/3/20
     * @Param
     **/
    int delPerson(@Param("state") int state, @Param("personId") int personId);


    /*
     * @Author James
     * @Description 批量更新 ssc cc bcc
     * @Date 11:22 2019/3/25
     * @Param
     * @return
     **/

    /**
     * 根据学生id批量修改ssc跟cc
     *
     * @param map
     * @return
     * @author Jay(liliu)
     */
    int updateBatchCCSSC(Map<String, Object> map);

    /**
     * 根据学院 id  列表 查询学院  信息
     *
     * @param list
     * @return
     */
    List<Person> selectBypersonIds(@Param("list") List<Integer> list);

    /**
     * @return
     * @Author James
     * @Description 根据 phone  或者  loginName查询学员信息
     * @Date 18:37 2019/3/25
     * @Param
     **/
    Person selectByPhoneOrLoginName(@Param("phone") String phone, @Param("loginName") String loginName);

    /**
     * 根据主键查询 代理信息
     * 参数:查询条件,主键值
     * 返回:对象
     */
    Agents selectAgentsById(@Param("id") String id);

    /**
     * @return
     * @Author James
     * @Description 修改 用户积分
     * @Date 14:38 2019/3/26
     * @Param
     **/
    int updatePersonIntegral(@Param("id") int id, @Param("integral") int integral);

    /**
     * @return
     * @Author James
     * @Description 添加  积分记录
     * @Date 14:56 2019/3/26
     * @Param
     **/
    int addintegralRecord(IntegralRecord record);

    /**
     * 添加奖学金记录
     *
     * @param record 奖学金信息
     * @return 记录数
     */
    int insertScholarship(StudentScholarship record);

    /**
     * 查询奖学金金额
     *
     * @param personId 用户id
     * @return 奖学金
     */
    Map<String, Object> selectStudentScholarship(@Param("personId") Integer personId);

    /**
     * 支付定金保留奖学金名额
     *
     * @param personId 用户id
     * @return 记录数
     */
    int updateStateByScholarshipByPersonId(@Param("personId") Integer personId);

    /**
     * @return
     * @Author James
     * @Description 导出 excel 列表数据
     * @Date 15:39 2019/3/28
     * @Param
     **/
    List<StudentInfo> exportPersonList(PersonParamter record);
}
